package com.gorkr;

import org.junit.jupiter.api.Test;

public class L29 {
    public int divide(int dividend, int divisor) {
        // dividend 被除数  divisor 除数
        // 因为最小负数 加个负号会产生溢出 -2^31 ~ 2^31-1
        if(dividend == Integer.MIN_VALUE  && divisor  == -1){
            return Integer.MAX_VALUE;
        }

        // 先全部转换为负数， 再调整结果。 因为正数转化为负数不会产生溢出。
        int negative = 2;
        if( dividend>0 ){
            negative--;
            dividend = -dividend;
        }
        if( divisor > 0) {
            negative--;
            divisor = -divisor;
        }

        int result = divideCore(dividend, divisor);


        return negative == 1 ? -result: result;
    }

    /**
     *
     * @param dividend 负数 被除数
     * @param divisor 负数 除数
     * @return
     */
    private int divideCore(int dividend, int divisor){
        int result = 0;
        while (dividend <= divisor){
            int value = divisor;
            int quotient = 1;
            while (value >= (Integer.MIN_VALUE/2) && dividend<= value+value){
                quotient += quotient;
                value += value;
            }
            result+=quotient;
            dividend -= value;

        }
        return result;
    }

    @Test
    public void test(){
        System.out.println(divide(10, 3));
    }

}
